package top.malaoshi.jdbc;

import java.lang.reflect.Field;

public class TypeUtil {

    /**
     * 判断基本数据类型，与 包装类型，是否一致
     * 如：
     * int 类型与 Integer类型，返回true
     * int 类型与 Long类型，返回 false
     * @param primitiveType 基本数据类型
     * @param wrapper 包装类型
     * @return
     * @throws NoSuchFieldException
     * @throws IllegalAccessException
     */
    public static boolean primitiveMatchWrapper(Class primitiveType,Class wrapper) {
        // 如果不是基本数据类型，就返回false
        if(!primitiveType.isPrimitive()){
            return false;
        }
        // 包装类型都有 TYPE 静态变量
        Field field = null;
        try {
            // 如果获取 TYPE 静态变量报错，说明不是包装类，直接返回false
            field = wrapper.getField("TYPE");
        } catch (NoSuchFieldException e) {
            return false;
        }
        Class type = null;
        try {
            type = (Class)field.get(null);
        } catch (IllegalAccessException e) {
            return false;
        }
        String wrapperName = type.getName();

        String primitiveName = primitiveType.getName();
        return wrapperName.equals(primitiveName);
    }

    /**
     * 是否数字类型的包装类型
     * @param wrapper
     * @return
     */
    public static boolean isNumberWrapper(Class wrapper){
        boolean b = ( wrapper == Byte.class ||
                wrapper == Short.class ||
                wrapper == Integer.class ||
                wrapper == Long.class ||
                wrapper == Float.class ||
                wrapper == Double.class
        );
        return b;
    }

    /**
     * 是否数字基本数据类型
     * @param primitive
     * @return
     */
    public static boolean isNumberPrimitive(Class primitive){
        boolean b = ( primitive == byte.class ||
                primitive == short.class ||
                primitive == int.class ||
                primitive == long.class ||
                primitive == float.class ||
                primitive == double.class
        );
        return b;
    }
    /**
     * 是否基本数据类型
     * @param primitive
     * @return
     */
    public static boolean isPrimitive(Class primitive){
        return primitive.isPrimitive();
    }
}
